package utils;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.math.BigDecimal;

import javax.imageio.ImageIO;
import javax.swing.JTextArea;
import javax.swing.event.EventListenerList;

import exceptions.EncodeException;

public class ImageWriter {
	private String diretoriobase = "E:\\backup";
	private File f;

	public BufferedImage lerImagem(String tipo) throws IOException {
		if (tipo.equalsIgnoreCase("jpeg")) {
			return ImageIO.read(new File(diretoriobase + "\\jpeg.jpg"));
		} else if (tipo.equalsIgnoreCase("x264")) {
			return ImageIO.read(new File(diretoriobase + "\\x264000000.bmp"));
		} else if (tipo.equalsIgnoreCase("x265")) {
			return ImageIO.read(new File(diretoriobase + "\\x265000000.bmp"));
		}
		return null;

	}

	public long criarImagemJPEG(String entrada, int qualidade, Process p) {
		try {

			PrintWriter stdin = new PrintWriter(p.getOutputStream());
			f = new File(diretoriobase + "\\jpeg.jpg");
			if (f.exists()) {
				f.delete();
			}
			stdin.println("\"" + diretoriobase + "\\convert.exe\" -quality " + qualidade + " \"" + entrada + "\" \"" + diretoriobase
					+ "\\jpeg.jpg\" ");
			stdin.flush();
			stdin.close();
			int returnCode = p.waitFor();
			return f.length();

			// System.out.println("Return code = " + returnCode);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return 0;
	}

	public long criarVideoX264(String entrada, BigDecimal qx264, Process p) {
		try {

			PrintWriter stdin = new PrintWriter(p.getOutputStream());
			f = new File(diretoriobase + "\\x264.mkv");
			if (f.exists()) {
				f.delete();
			}
//			stdin.println("\"" + diretoriobase + "\\x264.exe\" --preset placebo --tune ssim --crf " + qx264 + " -o \"" + diretoriobase
//					+ "\\x264.mkv\" \"" + entrada + "\"");
			
			stdin.println("\"" + diretoriobase + "\\x264.exe\" --preset placebo --tune psnr --crf " + qx264 + " -o \"" + diretoriobase
					+ "\\x264.mkv\" \"" + entrada + "\"");

			stdin.flush();
			stdin.close();
			int returnCode = p.waitFor();
			FileHandler fh = new FileHandler();

			return f.length();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return 0;
	}

	public void criarImagemX264(Process p) {
		try {
			PrintWriter stdin = new PrintWriter(p.getOutputStream());
			FileHandler fh = new FileHandler();
			fh.createAVSScreenshot(diretoriobase, "x264.mkv", "x264");
			stdin.println("\"" + diretoriobase + "\\avsutil.exe\" \"" + diretoriobase + "\\screenshot x264.avs\" play");
			stdin.flush();
			stdin.close();
			int returnCode = p.waitFor();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public long criarVideoX265(String entrada, BigDecimal qx265, Process p) {
		try {
			FileHandler fh = new FileHandler();
			fh.createAVSEncode(diretoriobase, entrada);
			PrintWriter stdin = new PrintWriter(p.getOutputStream());
			f = new File(diretoriobase + "\\x265.hevc");
			if ((f.exists()) && (f.isFile())) {
				f.delete();
			}
			f = new File(diretoriobase + "\\x265.mp4");
			if ((f.exists()) && (f.isFile())) {
				f.delete();
			}

			if (qx265.compareTo(new BigDecimal(6.0)) == 1) {
//				stdin.println("\"" + diretoriobase + "\\avs4x265.exe\" --preset placebo --psy-rd 1.0 --crf " + qx265 + " -o \""
//						+ diretoriobase + "\\x265.hevc\" \"" + diretoriobase + "\\encode x265.avs\"");
				stdin.println("\"" + diretoriobase + "\\avs4x265.exe\" --preset placebo --tune psnr --crf " + qx265 + " -o \""
						+ diretoriobase + "\\x265.hevc\" \"" + diretoriobase + "\\encode x265.avs\"");

			} else {
//				stdin.println("\"" + diretoriobase + "\\avs4x265.exe\" --preset placebo --psy-rd 1.0 --cu-lossless --crf " + qx265
//						+ " -o \"" + diretoriobase + "\\x265.hevc\" \"" + diretoriobase + "\\encode x265.avs\"");
				stdin.println("\"" + diretoriobase + "\\avs4x265.exe\" --preset placebo --tune psnr --cu-lossless --crf " + qx265
						+ " -o \"" + diretoriobase + "\\x265.hevc\" \"" + diretoriobase + "\\encode x265.avs\"");
			}
			stdin.flush();
			stdin.println("\"" + diretoriobase + "\\mp4box.exe\" -add \"" + diretoriobase + "\\x265.hevc\" \"" + diretoriobase
					+ "\\x265.mp4\"");
			stdin.flush();
			stdin.close();
			int returnCode = p.waitFor();
			f = new File(diretoriobase + "\\x265.mp4");
			return f.length();
			// fh.createAVSScreenshot(diretoriobase, "x264.mkv", "x264");
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return 0;
	}

	public void criarImagemX265(Process p) {
		try {			
			FileHandler fh = new FileHandler();
			PrintWriter stdin = new PrintWriter(p.getOutputStream());
			fh.createAVSScreenshot(diretoriobase, "x265.mp4", "x265");
			stdin.println("\"" + diretoriobase + "\\avsutil.exe\" \"" + diretoriobase + "\\screenshot x265.avs\" play");
			stdin.flush();
			stdin.close();
			int returnCode = p.waitFor();
		} catch (IOException | InterruptedException e) {
			e.printStackTrace();
		}
	}
}
